本发明公开了一种使用混合时钟源的计时方法,包括硬件时钟源选择和软件初始化操作步骤。所述硬件时钟源选择:内部时钟源选择MIPS时钟源,用于无节拍计时模式中非零号CPU的ClockEvent;外部时钟源选择HPET时钟源,用于周期性计时模式中的ClockEvent和ClockSource,以及无节拍计时模式中零号CPU的ClockEvent和无节拍计时模式中的ClockSource。所述软件初始化操作步骤包括:1)CPU初始化;2)每个CPU核都将MIPS时钟源注册为ClockEvent;3)将MIPS时钟源注册为ClockSource;4)系统设备初始化;5)非零号核将HPET时钟源注册为ClockEvent;6)将HPET时钟源注册为ClockSource;7)启动动态调核和自动变频机制。该方法同时支持传统的周期性计时模式和新近的无节拍计时模式。
1.一种使用混合时钟源的计时方法,其特征在于:包括硬件时钟源选择和系统软件初始化操作步骤;所述硬件时钟源选择:内部时钟源选择MIPS时钟源,用于无节拍计时模式中非零号CPU的ClockEvent;外部时钟源选择HPET时钟源,用于周期性计时模式中的ClockEvent和ClockSource,以及无节拍计时模式中零号CPU的ClockEvent和无节拍计时模式中的ClockSource;所述系统软件初始化操作步骤:(1),CPU初始化,包括CPU类型鉴别、寄存器初始值设置、Cache与TLB项填充、中断路由设置;(2),每个CPU核都将MIPS时钟源注册为ClockEvent,预设性能评分值rating值处于第一范围;所述“注册”的含义主要是设置一个设备的驱动程序,以便操作系统可以通过驱动来操作硬件;(3),将MIPS时钟源注册为ClockSource,预设性能评分值处于第一范围;至此,开始使用MIPS时钟源进行精确计时;(4),系统设备初始化,主要是设置HPET的计数器初值,启用其中断;(5),零号CPU核将HPET时钟源注册为ClockEvent,预设时钟源性能评分处于第二范围;(6),将HPET时钟源注册为ClockSource,预设rating值处于第二范围;至此,开始使用混合时钟源进行精确计时;(7),启动动态调核和自动变频机制,计时系统与电源管理开始协调工作。
2.如权利要求1所述的使用混合时钟源的计时方法,其特征在于:所述第二范围的性能评分值高于第一范围;性能评分值高的时钟源在注册以后被优先使用,取代评分值低的时钟源;因而在软件初始化早期使用单一时钟源计时,初始化完成之后使用混合时钟源计时。
3.如权利要求1或2所述的使用混合时钟源的计时方法,其特征在于:预设性能评分值处于第一范围是指预设性能评分值的范围为200~300;所述预设性能评分值处于第二范围是指预设性能评分值的范围为300~400。
技术领域本发明涉及一种使用混合时钟源的计时方法,属于计算机操作系统领域。
背景技术操作系统是计算机的管理者,作为管理者,操作系统需要维护时间,即计时(timekeeping)。计时最基本的功能是获取“当前时间”(Timexa0Ofxa0Day,简称TOD),而进程调度、软件定时器、性能采样统计、网络时间协议(NTP)等诸多操作系统功能都是建立在TOD概念之上的。计时功能的实现依赖于硬件上的“时钟源”设备。为了更清晰的表达,先将相关概念罗列如下:无节拍/周期性时钟模式:周期性(Periodic)模式是传统的计时模式,在这种模式下,硬件时钟源周期性地发射时钟中断,作为计时的主要依据。在多核或多处理器系统(以下都简称为SMP系统)中,计时由零号CPU维护(多核系统中,假设总核数为N,则N个核的物理编号分别是从0到N-1,其中零号核称为启动核或主核,其他核称为非启动核或辅核)。无节拍(Tickless)模式也叫NOHZ,是一种比较新的计时模式,它的硬件时钟源不会发射周期性时钟中断,而是根据需要选择性发射。在SMP系统中,计时由各个CPU轮流维护。ClockEvent/ClockSourse:ClockEvent是基于中断的时钟源(因此在SMP系统中,中断必须能够路由到每个CPU核),根据ClockEvent即可维护粗粒度(毫秒至微秒级步进幅度)时间。ClockSource是不需要中断的时钟源,由CPU主动读取其值,在粗粒度时间的基础上进行微调(可达微秒至纳秒级精度),取得精确的“当前时间”。ClockEvent是局部的(每个CPU都有一个),ClockSource是全局的(所有CPU共用一个)。软件定时器:用于预定多久以后触发一个事件,依赖于ClockEvent,跟ClockSource无关。Oneshot/Periodic时钟特征:描述硬件时钟源本身的特征,Oneshot是单发射特征,表示每进行一次编程只产生一次时钟中断,Periodic是周期性特征,表示一次编程可以连续周期性地产生中断。如果系统使用Periodic时钟模式,硬件具有Oneshot/Periodic特征中的任意一种即可满足需求;如果系统使用Tickless时钟模式,硬件必须具有Oneshot特征。内部时钟源:通常在CPU内部,每个核都有一个,在每个核上都能产生中断,一般只具有Oneshot特征。例如,在龙芯CPU上,Count/Compare寄存器对就是一种内部时钟源(一般称为MIPS时钟源),其中断间隔与CPU频率有关。内部时钟源可以做为ClockEvent,但在多核环境下,要用内部时钟源做ClockSource就必须保证每个核的计数器同步。外部时钟源:通常在CPU外部(如PIT、HPET等),同时具有Oneshot和Periodic特征,由于体系结构的限制,外部时钟源的中断不一定能路由到任意一个CPU核。外部时钟源的中断间隔与CPU频率无关。外部时钟源可以做为ClockSource,如果在中断路由上有所限制,那么只有在单核时才能做为ClockEvent。计时的基本方式是:ClockEvent时钟源每隔固定长度的时间(周期)给系统发送一次时钟中断,每次中断称为一个节拍(tick),记录节拍的总数就可以得到粗粒度(粒度与一个节拍相当,通常为毫秒至亚毫秒级)的“当前时间”。若需要高精度的计时,就需要使用亚节拍技术,一般采用系统主动读取ClockSource时钟源计数器值的方式获取,将亚节拍技术得到的时间偏移量叠加在粗粒度时间上面,就可以获取精确的“当前时间”(粒度比节拍更细,通常为微秒至亚微秒级)。图1清楚地描述了本发明所提及的主要概念之间的关系。在通常情况下,计时系统的ClockEvent和ClockSource会采用同一个时钟源,即要么都使用内部时钟源,要么都使用外部时钟源。但在多核系统上可能存在一些限制,如:1、CPU热插拔:CPU热插拔指的是在系统运行的时候可以动态地增加(上线)或减少(下线)CPU核。因为一个下线的CPU不再运行,其内部时钟源的计数器也不再增加,因此当一个CPU核下线一段时间又再度上线以后,各个内部时钟源的计数器就不再同步。因ClockSource具有全局特征,故假设上一次时钟中断的时刻是T1,现在是T2,那么“亚节拍修正”的修正值是T2时刻的计数器值减去T1时刻的计数器值。当各个内部时钟源不再同步时,若T1时刻和T2时刻读取的不是同一个计数器,那么这两个值的差实际上不能反应流逝的时间。因此,若不使用各种复杂的方法来让它们同步,便不能在启用CPU热插拔的同时使用内部时钟源作为ClockSource。2、中断控制器:ClockEvent要求每个CPU核都能收到时钟中断,但由于某些中断控制器的限制,非零号核可能无法接收中断,故在这样的情况下,ClockEvent不能使用外部时钟源。3、动态调频:时钟中断每个节拍发送一次,每个节拍对应的CPU周期数叫做LPJ值(Loopxa0Perxa0Jiffy),是编程ClockEvent时钟源的基础。为了达到性能与省电的均衡,现代CPU都支持动态调整主频。为了计时的精确,LPJ值必须在每次主频变化时进行一次修正。频繁的修正不仅浪费资源,而且会给计时带来较大的累计误差。动态调频主要影响ClockEvent,对ClockSource也有一定的影响(计数器差值乘以当前主频才能反应流逝的时间)。
发明内容发明目的:针对现有技术中存在的问题与不足,本发明提供一种同时支持传统的周期性计时模式和新近的无节拍计时模式的使用混合时钟源的计时方法。技术方案:一种使用混合时钟源的计时方法,包括硬件时钟源选择和软件操作步骤;所述硬件时钟源选择:内部时钟源选择MIPS时钟源,用于无节拍计时模式中非零号CPU的ClockEvent;外部时钟源选择HPET(即高精度事件定时器,Highxa0Precisionxa0Eventxa0Timer)时钟源,用于周期性计时模式中的ClockEvent和ClockSource,以及无节拍计时模式中零号CPU的ClockEvent和无节拍计时模式中的ClockSource;所述软件操作步骤:在软件上,每个时钟源都有一个rating值,它是时钟源的评分值,取值范围在1~500之间。评分值越高表示性能越优良,会被优先采用。“优良”是一个综合指标,表示精度高,或者计时稳定,通常1~100表示很差,100~200表示基本合格,200~300表示较好,300~400表示很好,400~500表示极好。软件操作步骤主要指的是操作系统内核对时钟源和计时系统的初始化,具体步骤如下:(1),CPU初始化,具体内容包括CPU类型鉴别、寄存器初始值设置、Cache与TLB项填充、中断路由设置等;这一步完成以后,MIPS内部时钟源在硬件上处于可用状态;(2),每个CPU核都将MIPS时钟源注册为ClockEvent,预设rating值处于第一范围;在本发明中,所述“注册”的含义主要是设置一个设备的驱动程序,以便操作系统可以通过驱动来操作硬件(将MIPS时钟源注册为ClockEvent就是把MIPS时钟源的驱动设置为ClockEvent驱动);这一步完成以后,已经可以使用MIPS时钟源进行粗粒度计时;(3),将MIPS时钟源注册为ClockSource,预设rating值处于第一范围;这一步完成以后,已经可以使用MIPS时钟源进行细粒度计时;(4),系统设备初始化,这里主要是设置HPET的计数器初值,启用其中断等;这一步完成以后,HPET外部时钟源在硬件上已经处于可用状态;(5),零号CPU将HPET时钟源注册为ClockEvent,预设rating值处于第二范围(高于第一范围);因为HPET时钟源的rating值较MIPS时钟源高,将会被优先使用。因此这一步完成以后,零号CPU的ClockEvent便切换成HPET;注意非零号CPU没有该步骤,它们继续使用MIPS时钟源。(6),将HPET时钟源注册为ClockSource,预设rating值处于第二范围;因为rating值较高,故这一步完成以后,ClockSource便切换成HPET;到此为止,混合时钟源计时系统已经完全可用;(7),启动动态调核和自动变频等电源管理机制;此时混合计时系统已经开始工作,可以与电源管理协调运行;并且由于ClockEvent和ClockSource都已经投入使用,故实现的是细粒度计时。所述性能评分值的第二范围高于第一范围;其中第一范围是指预设rating值的范围为200~300;第二范围是指预设rating值的范围为300~400。有益效果:与现有技术相比,本发明所提供的使用混合时钟源的计时方法,具有以下优点或用途:1.可以绕开各种平台相关的限制而实现精确计时。CPU热插拔、动态变频和中断控制器的限制使得单一时钟源计时变得难以实现、或者精度降低。本发明通过深入分析这些限制的本质和各种时钟源的特点,选择了不同的ClockEvent/ClockSource来避开这些问题。该方法同时使用了多种钟时钟源,用混合的方式巧妙地实现了精确计时。2.可以同时支持周期性计时模式和无节拍计时模式。传统的操作系统使用周期性计时,新的系统为了进一步提高性能和节约电能,引入了无节拍计时。本发明可以同时支持各种计时模式,因而有着广泛的适用范围。3.可以同时支持单核系统和多核系统。多核是未来的主流。本发明一开始就着重于对多核的支持,同时也兼顾了旧的单核系统(单核是多核的一种特例,只有零号CPU核)。
附图说明图1是系统计时的主要概念之间的关系;图2是本发明实施例的混合时钟源计时方法的周期性计时模式;图3是本发明实施例的混合时钟源计时方法的无节拍计时模式。
具体实施方式下面结合附图和具体实施例,进一步阐明本发明,应理解这些实施例仅用于说明本发明而不用于限制本发明的范围,在阅读了本发明之后,本领域技术人员对本发明的各种等价形式的修改均落于本申请所附权利要求所限定的范围。本实施例提供了一种使用混合时钟源的计时方法,基于(但不限于)龙芯3号多核处理器平台。该方法同时支持传统的周期性计时模式和新近的无节拍计时模式:周期性计时模式:在该模式下,计时完全由零号CPU核负责,其他CPU不参与。零号CPU总是可以接收外部中断的,因此为了防止动态变频给计时带来的困扰,ClockEvent采用外部时钟源。另一方面,亚节拍修正的发起者都是CPU0,各个CPU的内部计数器是否同步无关紧要,因此ClockSource既可以采用内部时钟源,也可以采用外部时钟源。考虑到动态变频的影响,一般建议ClockSource也采用外部时钟源(如图2)。无节拍计时模式:在该模式下,时钟中断是“按需”发射的,计时由各个CPU轮流负责(严格来说,哪个CPU的软件定时器最早到期,哪个CPU就负责计时)。为了防止动态变频的影响,零号CPU的ClockEvent采用外部时钟源;为了绕过中断控制器的限制,非零号CPU的ClockEvent采用内部时钟源;为了防止CPU热插拔造成的内部计数器不同步,ClockSource采用外部时钟源(如图3)。前面提到,动态变频会扩大内部时钟源作为ClockEvent的累计时间误差,那么在无节拍模式下,非零号CPU使用内部时钟源会不会有不良影响呢?确实有,但本发明提供了避免的办法,那就是:在负载(CPU利用率)比较高,一个核处理不过来时,禁用动态变频,同时引入自动核数调节技术。这样,系统负载高,有多个核运行时,主频不变化,计时是精确的;系统负载低,只有一个核(零号核)运行时,主频会变化,但零号核使用的是外部时钟源,不需要LPJ修正,因此计时也是精确的。另外,禁用动态变频所带来的节电效果损失,也完全可以由自动调核所弥补(关核同样可以节能)。一种使用混合时钟源的计时方法,包括硬件时钟源选择和软件操作步骤;所述硬件时钟源选择:内部时钟源选择MIPS时钟源,用于无节拍计时模式中非零号CPU的ClockEvent;外部时钟源选择HPET时钟源,用于周期性计时模式中的ClockEvent和ClockSource,以及无节拍计时模式中零号CPU的ClockEvent和无节拍计时模式中的ClockSource;所述软件操作步骤:主要指的是操作系统内核对时钟源和计时系统的初始化,具体步骤如下:(1),CPU初始化,包括CPU类型鉴别、寄存器初始值设置、Cache与TLB项填充、中断路由设置等;这一步完成以后,MIPS内部时钟源在硬件上处于可用状态;(2),每个CPU核都将MIPS时钟源注册为ClockEvent,预设rating值范围是“较好”(200~300);这一步完成以后,已经可以使用MIPS时钟源进行粗粒度计时;(3),将MIPS时钟源注册为ClockSource,预设rating值范围为“较好”(200~300);这一步完成以后,已经可以使用MIPS时钟源进行细粒度计时;(4),系统设备初始化,主要是设置HPET的计数器初值,启用其中断等;这一步完成以后,HPET外部时钟源在硬件上已经处于可用状态;(5),零号CPU将HPET时钟源注册为ClockEvent,预设rating值范围是“很好”(300~400);因为HPET时钟源的rating值较MIPS时钟源高,将会被优先使用。因此这一步完成以后,零号CPU的ClockEvent便切换成HPET;非零号CPU没有该步骤,它们继续使用MIPS时钟源。(6),将HPET时钟源注册为ClockSource,预设rating值范围为“很好”(300~400);因为rating值较高,故这一步完成以后,ClockSource便切换成HPET;到此为止,混合时钟源计时系统已经完全可用;(7),启动动态调核和自动变频等电源管理机制;此时混合计时系统(细粒度计时)已经开始工作,与电源管理协调运行。